﻿#pragma once

#include <string>
#include <vector>
#include <functional>
#include "opencv2/opencv.hpp"

namespace XCamera
{
	// 相机触发源
	enum TriggerSource
	{
		TRIGGER_SOFTWARE = 0,
		TRIGGER_LINE0,
		TRIGGER_LINE1,
		TRIGGER_LINE2,
		TRIGGER_LINE3,
		TRIGGER_ROTARY_ENCODER1	// dalsa线扫描：旋转编码器，光栅尺
	};

	// 像素格式
	enum PixelFormat
	{
		PX_MONO8 = 0,	// 单通道8位图像
		PX_MONO16,		// 单通道16位图像
		PX_RGB8,		// 3通道24位图像格式：像素位深度8位
		PX_RGBX,

		PX_3D_UNDEFINE,		// 未定义的3d格式
		PX_3D_INT16,		// 16位
		PX_3D_INT32			// 32位深度
	};

	// 图像格式：2d，原始数据（彩色，3d等），点云格式，3d格式
	enum ImageMode
	{
		XIMG_UNDEFINE = -1,		
		XIMG_2D,				
		XIMG_ORIGIN,			
		XIMG_POINT_CLOUD,		
		XIMG_RANGE_3D			
	};

	enum pixelType {
		// mono buffer
		px_mono8,
		px_mono10,
		px_mono12,
		px_mono16,
		
		// Bayer 
	};

	// 海康3d图像帧信息
	typedef struct X3D_FRAME_INFO_
	{
		int imageMode_;		// 图像类型：原始图，点云，深度图
							// 0 - 2d图像, 
							// 3D(海康相机): 1 - origin，4 - cloudPoint，5 - range3d
		int bitDepth;		// 像素格式：16位，32位

		int lineNums_;		// 行数
		int pointsPerLine_;	// 每行点数

		int width_;
		int height_;
	}X3D_FRAME_INFO;
	
	typedef struct _x_frame_info_
	{
		uchar* bufferPtr;
		int pixelType;		// 对应opencv像素信息，例如：8UC1,8UC3
		int bgr;			// 图像颜色通道，opencv mat中通常以BGR进行排列：brg=0表示以rgb方式排列，bgr=1表示bgr排列方式，bgr=2表示bayerRB8格式
		int width;
		int height;
		int64 hostTimeStamp;	// 时间戳
		int frameLen;		// 帧长度
		int reserved[64];	// 预留
	}x_frame_info;

	// 定义字符串数组
	using strings = std::vector<std::string>;
	// 图像采集回调函数
	// 1.opencv mat数据接口
	using CamerCallbackMat = void(*)(std::string camSn, cv::Mat& image, void* context);
	// 2.opencv 数据接口：cvType返回数据类型，自己调用Mat构造函数进行构造
	// cvType = CV_N(S|U|F)C
	// N-bit_depth  S-整型	U-无符号整形	F-浮点型
	// 例如：CV_8UC3,表示8bit，无符号uchar，3通道
	using CameraCallback = void(*)(std::string camSn, uchar* data, int w, int h, int pixelType, void* context);
	using XGrabCallback = void(*)(std::string camSn, uchar* data, x_frame_info *frmInfo, void* context);
	// 3.通用接口：PixelFormat为自定义接口，后续逐渐抛弃
	//using CameraCallback = void(*)(std::string cameraName, unsigned char *data, int w, int h, PixelFormat pixFormat, void *context);
	using CameraCallback3D = void(*)(const std::string cameraName, unsigned char* data, X3D_FRAME_INFO *frameInfo, void *context);
	// 日志输出回调函数
	using LogsCallback = void(*)(std::string logInfo, void *context);
}
